package listTest;

/**
 * @Author Zhang Chao
 * @Date 2021/5/17 8:17
 * @Version 1.0
 */

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * java LinkedList  的基本使用
 * 1.LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用.
 * @author hp
 * //https://blog.csdn.net/i_lovefish/article/details/8042883
 */
public class LinkedListTest {
    public static void main(String[] args) {
        LinkedList<String> lList = new LinkedList<String>();
        lList.add("1");
        lList.add("2");
        lList.add("3");
        lList.add("4");
        lList.add("5");

        /*1、获取链表的第一个和最后一个元素*/
        System.out.println("链表的第一个元素是 : " + lList.getFirst());
        System.out.println("链表最后一个元素是 : " + lList.getLast());
        /* 2、获取链表元素  */
        System.out.println("遍历LinkedList : ");
        for (String str: lList) {
            System.out.println(str);
        }
        /* 3、从链表生成子表 */
        List<String> subl = lList.subList(1, 4);
        System.out.println(subl);
        System.out.println(lList);

        //如果不指定索引的话，元素将被添加到链表的最后
        /*
         * public boolean add(Object element)
         * public boolean add(int index, Object element)
         */
//        lList.add(1,"A");
//        lList.add("B");
//        System.out.println(lList);

        //addLast()方法和不带索引的add()方法实现的效果一样.
        lList.addFirst("C");
        lList.addLast("D");
        System.out.println(lList);

        //5、删除元素
        lList.removeFirst();
        lList.removeLast();
        System.out.println(lList);

        //8、将LinkedList转换成ArrayList
        ArrayList<String> arrayList = new ArrayList<String>(lList);
        for (String s : arrayList) {
            System.out.println("s = " + s);
        }

        //9、删掉所有元素：清空LinkedList
//        System.out.println("删掉所有元素：清空LinkedList");
//        lList.clear();
//        System.out.println(lList);

        //10、删除列表的首位元素
        System.out.println("当前链表："+lList);
        //元素在删除的时候，仍然可以获取到元素
//        Object object = lList.removeFirst();
//        System.out.println(object + "  被删除了");
//        System.out.println(lList);
//        object = lList.removeLast();
//        System.out.println(object + "  被删除了");
//        System.out.println(lList);
        //11、根据范围删除列表元素
//        System.out.println("选中的区间为："+lList.subList(2, 5));
//        lList.subList(2, 5).clear();
//        System.out.println(lList);

        //12、删除链表的特定元素
//        System.out.println(lList);
//        System.out.println(lList.remove("2"));//删除元素值=2的元素
//        System.out.println(lList);
//        Object obj = lList.remove(2);  //删除第二个元素
//        System.out.println(obj + " 已经从链表删除");
//        System.out.println(lList);

        //将LinkedList转换为数组，数组长度为0
        System.out.println("//---------------------------------------------------------");
        List<String> theList = new LinkedList<String>();
        theList.add("A");
        theList.add("B");
        theList.add("C");
        theList.add("D");
        System.out.println(theList);
        Object[] objects = theList.toArray();
        for (int i = 0; i < objects.length ; i++) {
            System.out.println(objects[i]);
        }
        System.out.println("xxxxxxx");
        //13、将LinkedList转换为数组，数组长度为0
        String[] my = theList.toArray(new String[0]);
        for (int i = 0; i < my.length; i++) {
            System.out.println(my[i]);
        }
        //14、将LinkedList转换为数组，数组长度为链表长度
        my = theList.toArray(new String[theList.size()]);
        for (int i = 0; i < my.length; i++) {
            System.out.println(my[i]);
        }
        //15、将LinkedList转换成ArrayList
        LinkedList<String> myQueue = new LinkedList<String>();
        myQueue.add("A1");
        myQueue.add("B1");
        myQueue.add("C1");
        myQueue.add("D1");
        List<String> myList = new ArrayList<String>(myQueue);
        for (Object theFruit : myList){
            System.out.println(theFruit);
    }
}
}

